package com.hmall.search;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.hmall.common.client.ItemClient;
import com.hmall.common.dto.Item;
import com.hmall.common.dto.PageDTO;
import com.hmall.search.pojo.ItemDoc;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.io.IOException;
import java.util.List;


@RunWith(SpringRunner.class)
@SpringBootTest
public class test01 {

    // 自动注入ItemClient客户端，用于获取商品列表数据
    @Autowired
    private ItemClient client;

    // 自动注入RestHighLevelClient客户端，用于与Elasticsearch进行交互
    @Autowired
    private RestHighLevelClient restHighLevelClient;

    // 创建一个ObjectMapper实例，用于JSON序列化和反序列化
    private static final ObjectMapper MAPPER = new ObjectMapper();

    /**
     * 测试方法，将商品列表数据导入到Elasticsearch中
     * 该方法通过ItemClient客户端分页获取商品列表，并使用RestHighLevelClient客户端将商品数据批量导入到Elasticsearch中
     * @throws IOException 如果在与Elasticsearch通信或数据序列化过程中发生I/O错误
     */
    @Test
    public void test01() throws IOException {
        int page = 1;
        while (true) {
            // 获取指定页码和每页数量的商品列表数据
            PageDTO<Item> pageDto = client.getItemList(page, 500);
            List<Item> list = pageDto.getList();
            // 如果当前页的商品列表为空，说明所有数据已经处理完毕，退出循环
            if (list.size() <= 0) {
                break;
            }
            // 创建一个批量请求对象，用于将商品数据批量导入到Elasticsearch
            BulkRequest bulkRequest = new BulkRequest();
            for (Item item : list) {
                // 将商品对象转换为ItemDoc对象，准备导入到Elasticsearch
                ItemDoc itemDoc = new ItemDoc(item);
                // 向批量请求中添加索引请求，指定索引名为"item"，文档ID为商品ID，并设置文档源数据
                bulkRequest.add(new IndexRequest("item")
                        .id(itemDoc.getId().toString())
                        .source(MAPPER.writeValueAsString(itemDoc), XContentType.JSON));
            }
            // 执行批量请求，将商品数据导入到Elasticsearch
            restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
            page++;
        }
    }



}
